#pragma once
#include <string>
#include "SchaltwerkElement.h"
#include "Faktoren.h"
#include "GatterTyp.h"
#include "FlipFlop.h"
#include <vector>
#include <map>
#include <string>
#include "DFS_Daten_Type.h"
#include "SignalListeErzeuger.h"

class LaufzeitAnalysator{
public: 
	LaufzeitAnalysator(Faktoren faktoren, vector<SchaltwerkElement> vektor);
	LaufzeitAnalysator();
	~LaufzeitAnalysator();

	void LaufzeitAnalyse();
	double laufzeitUebergangspfad;
	double laufzeitAusgangspfad;
	double maxLaufzeitUebergangspfad;
	double maxLaufzeitAusgangspfad;
	double setup;
	string uebergangsPfad;
	string ausgangsPfad;
	long frequenz;
	SignalListenErzeuger sch;

private:
	struct classcomp {
		bool operator() (SchaltwerkElement lhs, SchaltwerkElement rhs) const
		{
			int lhsn = 0;
			int rhsn = 0;
			
			for (int x=0; x < lhs.getName().length(); x++)
			{
				lhsn = 10*lhsn + lhs.getName()[x];
			}
			for (int x=0; x < rhs.getName().length(); x++)
			{
				rhsn = 10*rhsn + rhs.getName()[x];
			}

			return lhsn < rhsn ;}
		};

	void DFS(SchaltwerkElement s);
	void DFS_visit(SchaltwerkElement s, SchaltwerkElement k);
	
	Faktoren faktoren;
	vector<SchaltwerkElement> vektor;
	vector<SchaltwerkElement> startElemente;
	map<const SchaltwerkElement, DFS_Daten_Type, classcomp> DFS_Zwischenspeicher;
	map<int, DFS_Daten_Type> DFS_Zwischenspeiche;
	double spannungFaktor, temperaturFaktor, prozessFaktor;
};